# Учебный проект: Корзина, часть 1

"Корзина" - компонент интерфейса онлайн магазина или ресторана, в который пользователи добавляют товары для заказа.

В нашем проекте она состоит из двух компонентов:

- Компонент `CartIcon` ("Иконка корзины") - его вы уже реализовали ранее. 
- Компонент `Cart` ("Корзина") - он отвечает за добавление и удаление товаров, а также будет отправлять заказ на сервер.

Компонент `Cart` достаточно сложный, поэтому мы его разбили на две части. В этой задаче мы начнем работу над ним. 

## Основа класса

```js
export default class Cart {
  cartItems = []; // (1) [product: {...}, count: N]

  constructor(cartIcon) { // (2)
    this.cartIcon = cartIcon;
  }

  onProductUpdate(cartItem) { // (3)
    this.cartIcon.update(this);
  }
}
```

1. Список товаров будем хранить в свойстве `cartItems` (детали ниже).
2. В качестве аргумента в конструктор класса передаётся экземпляр компонента `CartIcon`. Это понадобится, чтобы управлять иконкой корзины и обновлять количество товаров в ней.
3. Метод `onProductUpdate` будем вызывать при обновлении количества товаров, на текущий момент он будет обновлять `cartIcon`, позже мы добавим ему возможностей.

### Формат хранения товаров в cartItems

Товар одного вида может быть добавлен несколько раз, поэтому нам нужно помимо объекта товара хранить его количество. 

Все товары мы будем хранить в массиве в свойстве компонента `cartItems`. Для каждого товара в массиве будет специальный объект, содержащий объект этого товара в свойстве `product` и количество единиц этого товара в свойстве `count`:

```js
this.cartItems = [
  {
    // Объект товара
    product: {
        name: "Laab kai chicken salad", // название товара
        price: 10, // цена товара
        category: "salads", // категория товара
        image: "laab_kai_chicken_salad.png", // картинка товара (из папки assets)
        id: "laab-kai-chicken-salad" // внутренний идентификатор товара
    },
    count: 2 // Количество товаров
  },

  // ...другие товары
];
```

Объект внутри свойства `product` имеет такую же структуру, как объект товара из задачи про `ProductCard`.

## Реализуйте следующие методы

Допишите код методов ниже, чтобы они соответствовали требованиям. Пример использования находится в файле `index.html`.

### addProduct(product)

Добавляет товар в корзину, будет вызываться внешним кодом. 

В качестве аргумента принимает объект товара вида:

```js
let product = {
  name: "Laab kai chicken salad", // название товара
  price: 10, // цена товара
  category: "salads",
  image: "laab_kai_chicken_salad.png",
  id: "laab-kai-chicken-salad"
};

cart.addProduct(product);
```

**Требования к реализации метода:**

1. Если товара еще нет в корзине, то добавить его в массив `cartItems` с количеством `1`:
2. Если товар уже есть в корзине, то увеличить его количество на единицу.
3. С обновлённым элементом `cartItem` вызвать метод `onProductUpdate`:

```js
export default class Cart {
  // ...
  addProduct(product) {
    // ...

    // cartItem - обновлённый/новосозданный элемент cartItems
    this.onProductUpdate(cartItem);
  }
}
```

### updateProductCount(productId, amount)

Этот метод меняет количество единиц товара. Он будет вызываться при кликах по специальным кнопкам внутри корзины.

Он принимает два аргумента:

1. `productId` -  уникальный идентификтор товара, который есть у каждого товара и хранится в свойстве `id` в объекте товара.
2. `amount` - число для изменения количества единиц товара, `1` - если нужно увеличить на единицу, `-1` - если нужно уменьшить на единицу.

**Требования к реализации метода:**

1. Обновить количество единиц товара в массиве `cartItems`.
2. Если после изменения количества единиц товара, его количество стало `0`, то этот товар нужно удалить из корзины.
3. С обновлённым элементом `cartItem` вызвать метод `onProductUpdate`:

```js
export default class Cart {
  // ...
  updateProductCount(productId, amount) {
    // ...

    // cartItem - обновлённый элемент cartItems
    this.onProductUpdate(cartItem);
  }
}
```

### Метод isEmpty()

Возвращает `true` если корзина пустая и `false` если в корзине есть хотя бы один товар. 
 
```js
let cart = new Cart(cartIcon);

cart.isEmpty(); // true/false
```

### Метод getTotalCount()

Возвращает общее количество товаров в корзине. Обратите внимание, что один товар может быть добавлен несколько раз и это нужно учесть.

```js
let cart = new Cart(cartIcon);

cart.getTotalCount(); // количество всех товаров
```

### Метод getTotalPrice()

Возвращает стоимость всех товаров в корзине. Для этого нужно сложить все цены товаров с учетом количества каждого из них. Цену товара можно найти в свойстве `price` объекта товара. 

Помните, что товар может быть добавлен не в единственном экземпляре.

```js
let cart = new Cart(cartIcon);

cart.getTotalPrice(); // стоимость товаров
```
